package ai.rpc.core;

import ai.rpc.core.config.RegistryConfig;
import ai.rpc.core.config.RpcConfig;
import ai.rpc.core.registry.Registry;
import ai.rpc.core.registry.RegistryFactory;
import lombok.extern.slf4j.Slf4j;
import ai.rpc.core.utils.ConfigUtils;

import static ai.rpc.core.constant.RpcConstant.DEFAULT_CONFIG_PREFIX;

/**
 * @Author: mengyu
 * @Date: 2024/7/15
 * RPC 框架应用
 * 存放项目全局需要使用的变量
 */
@Slf4j
public class RpcApplication {
    private static volatile RpcConfig rpcConfig;

    /**
     * 自定义配置
     * @param newRpcConfig
     */
    public static void init(RpcConfig newRpcConfig){
        rpcConfig = newRpcConfig;
        log.info("rpc config init : {}",rpcConfig);

        // 注册中心
        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        Registry reg = RegistryFactory.getInstance("etcd");
        reg.init(registryConfig);
        log.info("registry init : {}",reg);

        // 注销时删除下线服务
        Runtime.getRuntime().addShutdownHook(new Thread(reg::destroy));
    }

    /**
     * 从配置文件中获取配置
     */
    public static void init(){
        RpcConfig tempRpcConfig;
        try {
            tempRpcConfig = ConfigUtils.loadConfig(RpcConfig.class, DEFAULT_CONFIG_PREFIX);
        }catch (Exception e){
            log.error("load rpc config failed : {}",e.getMessage());
            tempRpcConfig = new RpcConfig();
        }
        init(tempRpcConfig);
    }

    public static RpcConfig getRpcConfig(){
        // 双检锁实现单例RpcConfig
        if(rpcConfig == null){
            synchronized (RpcApplication.class){
                if(rpcConfig == null)
                    init();
            }
        }
        return rpcConfig;
    }
}
